home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / impl / skiplist.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-05  |  4.9 KB  |  186 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  skiplist.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_SKIPLIST_H
  16. #define LEDA_SKIPLIST_H
  17.  
  18. #include <LEDA/basic.h>
  19.  
  20. //------------------------------------------------------------------------------
  21. // Pugh's skip lists
  22. //------------------------------------------------------------------------------
  23.  
  24. class skiplist_node
  25.   friend class skiplist;
  26.  
  27.   GenPtr key;
  28.   GenPtr inf;
  29.   int    level;
  30.   skiplist_node* pred;  
  31.   skiplist_node* backward;  
  32.   skiplist_node* forward[1];  // variable sized array of forward pointers 
  33.  
  34.  };
  35.  
  36. typedef skiplist_node* skiplist_item;
  37.  
  38.  
  39. class skiplist
  40. {  
  41.    int level;                  // maximum level
  42.    skiplist_node*  header;     // pointer to header
  43.    skiplist_item STOP;         // pointer to end 
  44.    int randomBits;             // random bit source
  45.    int randomsLeft;            // number of unused bit pairs in randomBits
  46.    int count;                  // number of entries
  47.  
  48.    float prob;                 
  49.  
  50.    int  randomLevel();
  51.  
  52. virtual int cmp(GenPtr x, GenPtr y) const { return compare(x,y); }
  53. virtual void copy_key(GenPtr&)  const {}
  54. virtual void copy_inf(GenPtr&)  const {}
  55. virtual void clear_key(GenPtr&) const {}
  56. virtual void clear_inf(GenPtr&) const {}
  57. virtual void print_key(GenPtr)  const {}
  58. virtual void print_inf(GenPtr)  const {}
  59.  
  60. virtual int int_type()    const { return 0; }
  61.  
  62. skiplist_item search(GenPtr,int&) const;
  63. void          remove_item(skiplist_item);
  64. void          insert_item_at_item(skiplist_item,skiplist_item);
  65.  
  66. protected:
  67.  skiplist_item item(void* p) const { return skiplist_item(p); }
  68.  
  69. public:
  70.  
  71.  skiplist(float prob = 0.25);
  72.  skiplist(const skiplist&);
  73.  skiplist& operator=(const skiplist&);
  74.  virtual ~skiplist();
  75.  
  76.  GenPtr key(skiplist_item p) const;
  77.  GenPtr inf(skiplist_item p) const;
  78.  GenPtr& info(skiplist_item p) const;
  79.  int     get_level(skiplist_item p) const;
  80.  
  81.  skiplist_item insert(GenPtr key, GenPtr inf);
  82.  skiplist_item locate(GenPtr key) const;
  83.  skiplist_item locate_succ(GenPtr key) const;
  84.  skiplist_item locate_pred(GenPtr key) const;
  85.  skiplist_item lookup(GenPtr key) const;
  86.  skiplist_item min() const;
  87.  skiplist_item max() const;
  88.  void          reverse_items(skiplist_item,skiplist_item);
  89.  void          del(GenPtr key);
  90.  void          del1(GenPtr key);
  91.  
  92.  void          conc(skiplist&);
  93.  void          split_at_item(skiplist_item,skiplist&,skiplist&);
  94.  
  95.  void          print();
  96.  
  97.  skiplist_item insert_at_item(skiplist_item p, GenPtr key, GenPtr inf);
  98.  
  99.  skiplist_item insert1(GenPtr key, GenPtr inf);
  100.  
  101.  
  102.  void          change_inf(skiplist_item p, GenPtr inf);
  103.  void          del_item(skiplist_item p);
  104.  void          clear();
  105.  int           size() const;
  106.  int           empty() const;
  107.  
  108.  skiplist_item first_item() const;
  109.  skiplist_item next_item(skiplist_item p) const;
  110.  skiplist_item succ(skiplist_item p) const;
  111.  skiplist_item pred(skiplist_item p) const;
  112.  
  113.  
  114.  // piority queue operations
  115.  
  116.  skiplist_item find_min() const;
  117.  void del_min();
  118.  void decrease_key(skiplist_item p, GenPtr k);
  119.  
  120.  
  121. };
  122.  
  123.  
  124.  
  125.  
  126. inline GenPtr  skiplist::key(skiplist_item p) const { return p->key; }
  127. inline GenPtr  skiplist::inf(skiplist_item p) const { return p->inf; }
  128. inline GenPtr& skiplist::info(skiplist_item p) const { return p->inf; }
  129.  
  130. inline int     skiplist::get_level(skiplist_item p) const { return p->level; }
  131.  
  132.  
  133. inline skiplist_item skiplist::first_item() const  
  134. { skiplist_item q = header->forward[0];
  135.   return (q==STOP) ? 0 : q;
  136.  }
  137.  
  138. inline skiplist_item skiplist::min() const  
  139. { skiplist_item q = header->forward[0];
  140.   return (q==STOP) ? 0 : q;
  141.  }
  142.  
  143. inline skiplist_item skiplist::max() const  
  144. { skiplist_item q = STOP->pred;
  145.   return (q==header) ? 0 : q;
  146.  }
  147.  
  148. inline skiplist_item skiplist::next_item(skiplist_item p) const 
  149. { skiplist_item q =  p->forward[0]; 
  150.   return (q==STOP) ? 0 : q;
  151.  }
  152.  
  153. inline skiplist_item skiplist::succ(skiplist_item p) const 
  154. { skiplist_item q =  p->forward[0]; 
  155.   return (q==STOP) ? 0 : q;
  156.  }
  157.  
  158. inline skiplist_item skiplist::pred(skiplist_item p) const 
  159. { skiplist_item q =  p->pred; 
  160.   return (q==header) ? 0 : q;
  161.  }
  162.  
  163. inline void skiplist::change_inf(skiplist_item p, GenPtr inf) { p->inf = inf; }
  164. inline int  skiplist::size() const { return count; }
  165. inline int  skiplist::empty() const { return count==0; }
  166.  
  167. //priority queue
  168. inline skiplist_item skiplist::find_min() const { return min(); }
  169.  
  170. inline void skiplist::del_min() 
  171. { skiplist_item p = min(); if (p) del_item(p); }
  172.  
  173. inline void skiplist::decrease_key(skiplist_item p, GenPtr k) 
  174. { insert(k,p->inf); del_item(p);}
  175.  
  176.  
  177. // dummy I/O and cmp functions
  178.  
  179. inline void Print(const skiplist&,ostream&) { }
  180. inline void Read(skiplist&, istream&) { }
  181. inline int  compare(const skiplist&,const skiplist&) { return 0; }
  182.  
  183. #endif
  184.